﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tibet.Datos.Interfaces;
using Tibet.Datos.FabricaDatos;
using Tibet.Entidades;
using Tibet.Entidades.FabricaEntidades;
using System.Data.SqlClient;

namespace Tibet.Datos.DaosSqlServer
{
    public class DaoSqlServerAccesoMetrica : IDaoAccesoMetrica
    {
        IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();
        //Conexion bd = new Conexion();

        /// <summary>
        /// Metodo que consulta los perfiles creados existentes
        /// </summary>
        /// <returns>una lista con los perfiles de metricas existentes</returns>
      //jenny  
        public List<Entidad> ConsultarTodosPerfilMetrica(int opcion)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaPerfilMetrica = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar

                if (opcion == 0) //jenny
                {
                    command.CommandText = "[dbo].[SELPerfilMetricaTodos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                    command.CommandTimeout = 10;

                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        Entidad perfilmetrica = FabricaEntidades.ObtenerPerfilMetrica();
                        (perfilmetrica as PerfilMetrica).NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();
                        (perfilmetrica as PerfilMetrica).IdPerfilMetrica = reader.GetInt32(1);

                        listaPerfilMetrica.Add((perfilmetrica as PerfilMetrica));
                    }
                    reader.Close();
                    bd.CerrarConexionBd();
                    return listaPerfilMetrica;
                }

                else // pugo
                {
                    command.CommandText = "[dbo].[SELTodosPerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                    command.CommandTimeout = 10;

                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        PerfilMetrica perfilmetrica = new PerfilMetrica();
                        perfilmetrica.IdPerfilMetrica = reader.GetInt32(0);
                        perfilmetrica.NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();

                        listaPerfilMetrica.Add(perfilmetrica);
                    }
                    reader.Close();
                    bd.CerrarConexionBd();
                    return listaPerfilMetrica;
                }
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }
        
        /// <summary>
        /// Metodo que consulta la lista de todas las metricas que se encuentran en la base de datos
        /// </summary>
        /// <returns>una lista con las metricas existentes</returns>
        public List<Entidad> ConsultarTodasMetrica()
        {
            
           
            SqlCommand command = new SqlCommand();
            List<Entidad> listaMetricas = new List<Entidad>();

            try
            {
                bd.AbrirConexionBd();


                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodasLasMetricas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad miMetrica = FabricaEntidades.ObtenerMetrica();
                    (miMetrica as Metrica).IdMetrica = reader.GetInt32(0);
                    (miMetrica as Metrica).NombreMetrica = reader["NombreMetrica"].ToString();
                    (miMetrica as Metrica).Descripcion = reader["Descripcion"].ToString();

                    listaMetricas.Add(miMetrica);
                }

                reader.Close();
                bd.CerrarConexionBd();
                return listaMetricas;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }


        /// <summary>
        /// Metodo que consulta la lista de todas las metricas que se encuentran en la base de datos de un perfil
        /// </summary>
        /// <returns>una lista con las metricas existentes</returns>
        public List<Entidad> ConsultarTodasMetricaDePerfil(int IdPerfilMetrica)
        {


            SqlCommand command = new SqlCommand();
            List<Entidad> listaMetricas = new List<Entidad>();

            try
            {
                bd.AbrirConexionBd();


                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMetricaDePerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Busqueda por ID en la BD
                command.Parameters.AddWithValue("@IdPerfilMetrica", IdPerfilMetrica);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad miMetrica = FabricaEntidades.ObtenerMetrica();
                    (miMetrica as Metrica).IdMetrica = reader.GetInt32(0);
                    (miMetrica as Metrica).NombreMetrica = reader["NombreMetrica"].ToString();
                    (miMetrica as Metrica).Descripcion = reader["Descripcion"].ToString();

                    listaMetricas.Add(miMetrica);
                }

                reader.Close();
                bd.CerrarConexionBd();
                return listaMetricas;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }



        /// <summary>
        /// Metodo que consulta la lista de todas las metricas que se encuentran en la base de datos de un perfil
        /// </summary>
        /// <returns>una lista con las metricas existentes</returns>
        public List<Entidad> ConsultarTodasPerfilesPorNombre(String NombrePerfiles)
        {

            SqlCommand command = new SqlCommand();
            List<Entidad> listaPerfilMetrica = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELPerfilMetricaPorNombre]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
 
                command.Parameters.AddWithValue("@NombrePerfil", NombrePerfiles);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad perfilmetrica = FabricaEntidades.ObtenerPerfilMetrica();
                    (perfilmetrica as PerfilMetrica).IdPerfilMetrica = reader.GetInt32(0);
                    (perfilmetrica as PerfilMetrica).NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();
                    listaPerfilMetrica.Add((perfilmetrica as PerfilMetrica));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaPerfilMetrica;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }


        /// <summary>
        /// Metodo Para insertar el perfil metrica en la base de datos
        /// </summary>
        /// <param name="perfilmetrica"></param>
        /// <returns></returns>
        public bool InsertarPerfilMetrica(Entidad perfilMetricaGeneral)
        {
            
            SqlCommand command = new SqlCommand();

            PerfilMetrica perfilMetrica = (PerfilMetrica)perfilMetricaGeneral;
            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[InsertPerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@Nombre", perfilMetrica.NombrePerfilMetrica);


                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }


        /// <summary>
        /// Metodo Para insertar el perfil metrica en la base de datos
        /// </summary>
        /// <param name="perfilmetrica"></param>
        /// <returns></returns>
        public bool ModificarPerfilMetrica(int IdPerfilMetrica, String NuevoNombre)
        {

            try
            {
                SqlCommand commandNombre = new SqlCommand(); // Update Nombre Perfil
                bd.AbrirConexionBd();

                commandNombre.Connection = bd.ObjetoConexion();
                commandNombre.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                commandNombre.CommandText = "[dbo].[UpdatePerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                commandNombre.CommandTimeout = 10;

                commandNombre.Parameters.AddWithValue("@IdPerfil", IdPerfilMetrica);
                commandNombre.Parameters.AddWithValue("@NombrePerfil", NuevoNombre);
                SqlDataReader reader = commandNombre.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();

                SqlCommand commandBorrarMetricas = new SqlCommand(); // Delete Metricas de Perfil

                bd.AbrirConexionBd();

                commandBorrarMetricas.Connection = bd.ObjetoConexion();
                commandBorrarMetricas.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                commandBorrarMetricas.CommandText = "[dbo].[DELPerfilMetricaMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                commandBorrarMetricas.CommandTimeout = 10;

                commandBorrarMetricas.Parameters.AddWithValue("@IdPerfil", IdPerfilMetrica);
                reader = commandBorrarMetricas.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;
            }


            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }



        public int ConsultarMaxIdPerfil()
        {
            
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[MaxIdPerfilMetricas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica

                SqlDataReader reader = command.ExecuteReader();
                int max = 0;
                while (reader.Read())
                {
                    max = reader.GetInt32(0);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return max;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }

        public int ContarProyectosConPerfil(int idPefilMetrica)
        {

            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[COUNTPerfilesEnProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Conteo 
                command.Parameters.AddWithValue("@IdPerfil", idPefilMetrica);
                SqlDataReader reader = command.ExecuteReader();
                int max = 0;
                while (reader.Read())
                {
                    max = reader.GetInt32(0);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return max;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return -1;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return -1;
            }
        }

        public bool InsertarPerfilMetricaMetrica(int idPerfilMetrica, int idMetrica)
        {
            
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[InsertPerfilMetricaMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@id_Perfil_Metrica", idPerfilMetrica);
                command.Parameters.AddWithValue("@id_Metrica", idMetrica);

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }



       

        /// <summary>
        /// Metodo que regresa un perfil con el nombre del mismo y el id de las metricas que tiene para poder
        /// comparar en las pruebas
        /// </summary>
        /// <param name="idPerfilMetrica"></param>
        /// <returns>PerfilMetrica</returns>
        public Entidad ConsultarPerfilMetricaMetricas(int idPerfilMetrica)
        {
            
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELPerfilMetricaMetricas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@Id", idPerfilMetrica);

                SqlDataReader reader = command.ExecuteReader();
                PerfilMetrica perfil = new PerfilMetrica();
                List<Metrica> metricas = new List<Metrica>();

                while (reader.Read())
                {                    
                    perfil.NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();
                    Metrica miMetrica = new Metrica();
                    miMetrica.IdMetrica = reader.GetInt32(1);
                    metricas.Add(miMetrica);
                }

                perfil.MisMetricas = metricas;
                reader.Close();
                bd.CerrarConexionBd();
                return perfil;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }



        public int ConsultarPerfilMetricaNombre(String nombre)
        {
            int id = 0;
            SqlCommand command = new SqlCommand();
            
            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[ConsultarPerfilmetricaPorNombre]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@NombrePerfil", nombre);


                SqlDataReader reader = command.ExecuteReader();

               
                while (reader.Read())
                {
                    id = reader.GetInt32(0);
                }

                reader.Close();
                bd.CerrarConexionBd();
                return id;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return -1;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return id;
            }
        }


    }
}
